0x1 Jinja2
1.1 Jinja2模板引擎
模板是包含响应文本的文件,其中包含用站位变量表示的动态部分
templates/user.html
Hello, { { name }}!
Flask提供render_template函数把Jinja2模板引擎集成到程序中
渲染模板
from flask import Flask, render_template#...@app.route('/')def index(): return render_template('index.html')@app.route('/user/')def user(name): return render_template('user.html', name=name)
Jinja2能识别所有类型的变量
A value from a dictionary: {
{ mydict['key'] }}.A value from a list: {
{ mylist[3] }}.A value from a list,with a variable index: {
{ mylist[myintvar] }}.A value from an object's method: {
{ myobj.somemethod() }}.
可以使用过滤器修改变量
Hello,{ { name|capitalize }}Jinjia2变量过滤器:http://jinja.pocoo.org/docs/2.9/templates/#builtin-filters safe 渲染值时不转义capitalize 首字母大写,其他小写lower 转换小写upper 转换大写title 把值中每个单词首字母转换成大写trim 去掉值的首尾空格striptags 渲染前把值中所有HTML标签删掉
1.2 控制结构
{% if user %} Hello, { { user }}{ % else %} Hello, Stranger!{ % endif %}
- { % for comment in comments %}
- { { comment }} { % endfor %}
宏
{% macro render_comment(comment) %}
- { % for comment in comments %} { { render_comment(comment) }}{ % endfor %}
重复使用宏,可以将其保存在单独的文件中
{% import 'macros.html' as macros %}
- { % for comment in comments %} { { macros.render_comment(comment) }} { % endfor %}
继承,先创建名为base.html的模板
{% block head %}{% block title %}{% endblock %} - MyApplication {% endblock %} {% block body %} {% endblock %}
block标签定义的元素可在衍生模板中修改
{% extends "base.html" %}{% block title %}Index{% endblock %}{% block head %} { { super() }} {% endblock %}{% block body %}Hello, World
{% endblock %}
使用super()获取原来模板中的内容
0x2 Flask-Bootstrap & 错误页面
2.1 Flask-Bootstrap
git checkout 3b
Bootstrap官方文档 http://getbootstrap.com/
(venv) $ pip install flask-bootstrap
初始化Flask-Bootstrap
from flask.ext.bootstrap import Bootstrap#...bootstrap = Bootstrap(app)
templates/user.html 使用Flask-Bootstrap的模板
{% extends "bootstrap/base.html" %}{% block title %}Flasky{% endblock %}{% block navbar %}{% endblock %}{% block content %}{% endblock %}Hello, { { name }}!
如果程序需要向已经有内容的块中添加新内容,必须使用Jinja2提供的super()函数
如果要在衍生模板中添加新的js文件{% block scripts %}{ { super() }}{% endblock %}
2.2 错误页面
git checkout 3c@app.errorhandler(404)def page_not_found(e): return render_template('404.html'), 404@app.errorhandler(500)def internal_server_error(e): return render_template('500.html'), 500
templates/base.html
{% extends "bootstrap/base.html" %}{% block title %}Flasky{% endblock %}{% block navbar %}{% endblock %}{% block content %}{% block page_content %}{% endblock %}{% endblock %}templates/404.html{% extends "base.html" %}{% block title %}Flasky - Page Not Found{% endblock %}{% block page_content %}{% endblock %}templates/user.html{% extends "base.html" %}{% block title %}Flasky{% endblock %}{% block page_content %}Not Found
{% endblock %}Hello, { { name }}!
0x3 链接 & 静态文件 & Flask-Moment
3.1 链接
git checkout 3d
Flask提供了url_for()可以使用程序URL映射中保存的信息生成URL
使用url_for()生成动态地址时,将动态部分作为关键字参数传入
url_for('user',name='john',_external=True)的返回结果是http://localhost:5000/user/john
传入url_for()的关键字参数能将任何额外参数添加到查询字符串中
url_for('index',page=2)的返回结果是/?page=2
3.2 静态文件
调用url_for('user',name='john',_external=True)的返回结果是http://xx/static/css/styles.css
templates/base.html:定义收藏夹图标
{% block head %}{ { super() }} {% endblock %}
3.3 Flask-Moment本地化日期和时间
git checkout 3e
学习moment.js提供的全部格式化选项:http://momentjs.com/docs/#/displaying
(venv) $ pip install flask-moment
初始化Flask-moment
from flask.ext.moment import Momentmoment = Moment(app)
templates/base.html:引入moment.js库
{% block scripts %}{ { super() }}{ { moment.include_moment() }}{ % endblock %}
代码把变量current_time传入模板进行渲染
from datetime import datetime@app.route('/')def index(): return render_template('index.html',current_time=datetime.utcnow())
模板中渲染current_time
templates/index.html:使用Flask-Moment渲染时间戳
The local date and time is {
{ moment(current_time).format('LLL') }}.That was {
{ moment(current_time).fromNow(refresh=True) }}.
format('LLL')根据客户端电脑中的时区和时域设置渲染日期时间,L到LLLL对应不同复杂度
format() 还可以接受自定义格式说明符 fromNow()渲染相对应时间戳,指定refresh后,其内容随时间推移而更新语言可在模板中选择,把语言代码传给lang()
{ { moment.lang('es') }}